#include <stdio.h>
#include <stdlib.h>

int main()
{
 	printf("请输入个数：");
	int len;
	scanf("%d",&len);
	// 动态申请内存大小，存放int数值的内存大小
	int* arr = (int*)malloc(sizeof(int)*len);

	printf("开辟内存的头地址：%p\n",arr);

	printf("-------------arr\n");
	int i = 0;
	int value;
	for(;i<len;i++)
	{
 		printf("请输入第%d个元素的值：",i);
		scanf("%d",&value);
		arr[i] = value;
		printf("value  = %d, value_p = %p \n",*(arr+i), arr+i);
	}
	
	printf("继续增加内存的个数：");
	int num;
	scanf("%d",&num);

	/*
	 * 参数一：原来申请的内存首地址
	 * 参数二：申请新的内存总大小，需要计算之前申请内存和增加的内存大小之和
	 * 说明：
	 * 1.默认情况下，新申请的内存头指针和原来申请的内存头指针是相同的，因为是在原来内存地址基础上向后的内存，因为原来内存地址对应的值也是不需要重新赋值的
	 * 2.重新申请内存，但是此时原始内存地址后不存在连续的内存情况下，会将已经申请的内存，拷贝到新的内的地址，并且加上新申请的内存，此时新申请的内存头地址会发生变化
	 * 3.内存不足的情况下，申请的地址可能为NULL，因此在使用内存的时候，需要判断头地址是否为NULL
	 * 4.内存使用结束后，需要对申请的内存进行释放，并且需要对内存头地址进行置NULL
	 * 5.不要对某块内存进行反复的释放，因为此时也许是程序的其他地方在使用这块内存，导致程序错误，也许是别的程序在使用这块内存，无权释放
	 * */
	int* arr_new = (int*)realloc(arr,sizeof(int)*(len + num));

	if(arr_new){
		printf("重新开辟开辟内存的头地址：%p\n",arr_new);
		i = num;	
		for(;i<(len+num);i++)
		{
			arr[i] = i;
		}
		// 遍历重新赋值的内容
		printf("-------------arr_new\n");
		i = 0;
		for(;i<(len+num);i++)
		{
			printf("-->%d\n",*(arr_new+i));
		}
		// 释放内存
		free(arr_new);
		// 指针置空
		arr_new = NULL;
	} else {
		// 释放内存
		free(arr);
		// 指针置空
		arr = NULL;
	}
	
	exit(0);
}
